package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	//主动连接服务器
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	defer conn.Close()
	if err != nil {
		fmt.Println("net.Dial err = ", err)
		return
	}

	go func() {
		str := make([]byte, 1024)
		for { //注意这里的无限循环，不断接收用户的键盘输入
			//获取键输入的内容并保存在str中
			n, err := os.Stdin.Read(str)
			if err != nil {
				fmt.Println("输入读取失败：", err)
				return
			}
			//发送给服务端
			conn.Write(str[:n])
		}
	}()

	/**
		以上的代码块，必须使用协程。
		可以尝试，如果不使用协程，程序会无限卡在上面的循环中，可以正常向服务器发送数据
		但因为根本没有机会执行下面的代码，所以也就收不到服务端的响应。
		使用了协程后，可以理解为有两个任务在同时运行
		任务1：接收键盘输入，并发送给服务端。
		任务2：接收服务器发来的数据，打印出来。
	**/

	buf := make([]byte, 1024)
	for {
		n, err := conn.Read(buf) //阻塞，同理for中的代码块，只会在服务器发来一次数据后，才会被执行一次
		if err != nil {
			fmt.Println("从服务端读取失败", err)
			return
		}
		fmt.Println("服务端发来消息：", string(buf[:n]))
	}
}
